﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Common.Utils.S7Help
{
    public static class DataConvertLib
    {
        //
        // 摘要:
        //     返回某个字节的指定位
        //
        // 参数:
        //   value:
        //     字节
        //
        //   offset:
        //     偏移位
        //
        // 返回结果:
        //     布尔结果
        //
        // 言论：
        //     偏移位0-7有效，否则结果不正确
        [Description("返回某个字节的指定位")]
        public static bool GetBitFromByte(byte value, int offset)
        {
            return (value & (1 << offset)) != 0;
        }

        //
        // 摘要:
        //     从字节数组中截取某个字节
        //
        // 参数:
        //   value:
        //     字节数组
        //
        //   start:
        //     开始索引
        //
        // 返回结果:
        //     返回字节
        [Description("从字节数组中截取某个字节")]
        public static byte GetByteFromByteArray(byte[] value, int start)
        {
            if (start > value.Length - 1)
            {
                throw new ArgumentException("字节数组长度不够或开始索引太大");
            }

            return value[start];
        }

        //
        // 摘要:
        //     字节数组中截取转成16位整型
        //
        // 参数:
        //   value:
        //     字节数组
        //
        //   start:
        //     开始索引
        //
        //   dataFormat:
        //     数据格式
        //
        // 返回结果:
        //     返回Short结果
        [Description("字节数组中截取转成16位整型")]
        public static short GetShortFromByteArray(byte[] value, int start = 0, DataFormat dataFormat = DataFormat.ABCD)
        {
            byte[] value2 = ByteArrayLib.Get2BytesFromByteArray(value, start, dataFormat);
            return BitConverter.ToInt16(value2, 0);
        }

        //
        // 摘要:
        //     字节数组中截取转成16位无符号整型
        //
        // 参数:
        //   value:
        //     字节数组
        //
        //   start:
        //     开始索引
        //
        //   dataFormat:
        //     数据格式
        //
        // 返回结果:
        //     返回UShort结果
        [Description("字节数组中截取转成16位无符号整型")]
        public static ushort GetUShortFromByteArray(byte[] value, int start = 0, DataFormat dataFormat = DataFormat.ABCD)
        {
            byte[] value2 = ByteArrayLib.Get2BytesFromByteArray(value, start, dataFormat);
            return BitConverter.ToUInt16(value2, 0);
        }

        //
        // 摘要:
        //     字节数组中截取转成32位整型
        //
        // 参数:
        //   value:
        //     字节数组
        //
        //   start:
        //     开始索引
        //
        //   dataFormat:
        //     数据格式
        //
        // 返回结果:
        //     返回int类型
        [Description("字节数组中截取转成32位整型")]
        public static int GetIntFromByteArray(byte[] value, int start = 0, DataFormat dataFormat = DataFormat.ABCD)
        {
            byte[] value2 = ByteArrayLib.Get4BytesFromByteArray(value, start, dataFormat);
            return BitConverter.ToInt32(value2, 0);
        }

        //
        // 摘要:
        //     字节数组中截取转成32位无符号整型
        //
        // 参数:
        //   value:
        //     字节数组
        //
        //   start:
        //     开始索引
        //
        //   dataFormat:
        //     数据格式
        //
        // 返回结果:
        //     返回UInt类型
        [Description("字节数组中截取转成32位无符号整型")]
        public static uint GetUIntFromByteArray(byte[] value, int start = 0, DataFormat dataFormat = DataFormat.ABCD)
        {
            byte[] value2 = ByteArrayLib.Get4BytesFromByteArray(value, start, dataFormat);
            return BitConverter.ToUInt32(value2, 0);
        }

        //
        // 摘要:
        //     将字节数组中某4个字节转换成Float类型
        //
        // 参数:
        //   value:
        //     字节数组
        //
        //   start:
        //     开始索引
        //
        //   dataFormat:
        //     数据格式
        //
        // 返回结果:
        //     返回一个浮点数
        [Description("将字节数组中某4个字节转换成Float类型")]
        public static float GetFloatFromByteArray(byte[] value, int start = 0, DataFormat dataFormat = DataFormat.ABCD)
        {
            byte[] value2 = ByteArrayLib.Get4BytesFromByteArray(value, start, dataFormat);
            return BitConverter.ToSingle(value2, 0);
        }

        //
        // 摘要:
        //     将字节数组中某8个字节转换成Double类型
        //
        // 参数:
        //   value:
        //     字节数组
        //
        //   start:
        //     开始位置
        //
        //   dataFormat:
        //     字节顺序
        //
        // 返回结果:
        //     Double类型数值
        [Description("将字节数组中某8个字节转换成Double类型")]
        public static double GetDoubleFromByteArray(byte[] value, int start = 0, DataFormat dataFormat = DataFormat.ABCD)
        {
            byte[] value2 = ByteArrayLib.Get8BytesFromByteArray(value, start, dataFormat);
            return BitConverter.ToDouble(value2, 0);
        }

        //
        // 摘要:
        //     字节数组中截取转成64位整型
        //
        // 参数:
        //   value:
        //     字节数组
        //
        //   start:
        //     开始索引
        //
        //   dataFormat:
        //     数据格式
        //
        // 返回结果:
        //     返回一个Long类型
        [Description("字节数组中截取转成64位整型")]
        public static long GetLongFromByteArray(byte[] value, int start = 0, DataFormat dataFormat = DataFormat.ABCD)
        {
            byte[] value2 = ByteArrayLib.Get8BytesFromByteArray(value, start, dataFormat);
            return BitConverter.ToInt64(value2, 0);
        }

        //
        // 摘要:
        //     字节数组中截取转成64位无符号整型
        //
        // 参数:
        //   value:
        //     字节数组
        //
        //   start:
        //     开始索引
        //
        //   dataFormat:
        //     数据格式
        //
        // 返回结果:
        //     返回一个ULong类型
        [Description("字节数组中截取转成64位无符号整型")]
        public static ulong GetULongFromByteArray(byte[] value, int start = 0, DataFormat dataFormat = DataFormat.ABCD)
        {
            byte[] value2 = ByteArrayLib.Get8BytesFromByteArray(value, start, dataFormat);
            return BitConverter.ToUInt64(value2, 0);
        }

        //
        // 摘要:
        //     将字节数组转换成字符串
        //
        // 参数:
        //   value:
        //     字节数组
        //
        //   start:
        //     开始索引
        //
        //   count:
        //     数量
        //
        // 返回结果:
        //     转换结果
        [Description("将字节数组转换成字符串")]
        public static string GetStringFromByteArrayByBitConvert(byte[] value, int start, int count)
        {
            return BitConverter.ToString(value, start, count);
        }

    }

    //
    // 摘要:
    //     字节顺序，大小端
    [Description("字节顺序，大小端")]
    public enum DataFormat
    {
        //
        // 摘要:
        //     按照顺序排序
        [Description("按照顺序排序")]
        ABCD,
        //
        // 摘要:
        //     按照单字反转
        [Description("按照单字反转")]
        BADC,
        //
        // 摘要:
        //     按照双字反转
        [Description("按照双字反转")]
        CDAB,
        //
        // 摘要:
        //     按照倒序排序
        [Description("按照倒序排序")]
        DCBA
    }
}
